package com.mcc.myapplication

/**
 * 在 Kotlin 中任何表达式都可以用标签来标记。 标签的格式为标识符后跟 @ 符号
 */
fun demo1() {
    loop@ for (i in 1..100) {
        for (j in 1..100) {
            if (j > 1) break@loop
            println(j)
        }
    }
}

/**
 * 返回到标签
 */
fun demo2() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return // 非局部直接返回到 demo2() 的调用者
        print(it)
    }
    println("this point is unreachable")
}

fun demo3() {
    listOf(1, 2, 3, 4, 5).forEach lit@{
        if (it == 3) return@lit // 局部返回到该 lambda 表达式的调用者——forEach 循环
        print(it)
    }
    print(" done with explicit label")
}

fun demo4() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach // 局部返回到该 lambda 表达式的调用者——forEach 循环
        print(it)
    }
    print(" done with implicit label")
}

fun demo5() {
    listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
        if (value == 3) return  // 局部返回到匿名函数的调用者——forEach 循环
        print(value)
    })
    print(" done with anonymous function")
}

fun main() {
    demo5()
}